package br.com.serctam.entity;

import java.io.Serializable;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Past;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

@Entity
@Scope(ScopeType.CONVERSATION)
@AutoCreate
@Name("candidato")
@SequenceGenerator(sequenceName="candidato_seq" ,  name="candidato_seq" , allocationSize=1)

public class Candidato implements Serializable{
	
    /**
	 * 
	 */
	private static final long serialVersionUID = 2378361286371799161L;
	// seam-gen attributes (you should probably edit these)
    private Long id;
    private Integer version;

    private String numeroPreInscricao;
    private String numeroInscricao;
    
    private Cargo cargo;
    private Localidade localidade;
    
    //Recursos e/ou aparatos especiais de que necessita para realizar as provas:
    private Boolean cadeirante;
    private Boolean visualBraile;
    private Boolean visualLeitor;
    private Boolean gestante;
    private Boolean lactante;
    private Boolean outros;	 
    
    
    private String nome;
    private String cpf;
    private String sexo;
    private String endereco;
    private Cidade cidade;
    private String bairro;
    private String cep;
    private String dddFone;
    private String fone;
    private String dddCelular;
    private String celular;
    private Integer qtFilho; //menor de 18 anos
    private String email;
    private Date dataNascimento;
    private Long rg;
    private String estadoCivil; //Lista fixa no xhtml
    private String canhoto; // S-Sim ou N-Nao
    private Date dataInscricao;
    private String obs;
    
    //Boleto
    private BoletoPdf boletoPdf;
    private Date dataVencimentoBoleto; 
    private RetornoBB retornoBB;
    private String nossoNumero;
    private String statusPagamento;
    private Boolean mailPgEnviado;
    
    //Isensao
    private Boolean solicitouIsencao;
    private Boolean foiDeferidoIsencao;
    
    //Desconto
    private Boolean solicitouDesconto;
    private Boolean foiDeferidoDesconto;
    
    
    



    public Candidato(){
    	
    }
    
    //Campos para listagem de retorno do arquivo do BB
    private String valorPago;
    public Candidato(Long id, String nome, String cpf,Date dataNascimento, String statusPagamento, Long cargoId){
    	this.id = id;
    	this.nome = nome;
    	this.cpf = cpf;
    	this.dataNascimento = dataNascimento;
    	this.statusPagamento = statusPagamento;
    	
    	this.setCargo(new Cargo());
    	this.getCargo().setId(cargoId);
    }

    @NotEmpty
    @Length(max = 60)
    public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

    @Id @GeneratedValue(strategy=GenerationType.SEQUENCE , generator="candidato_seq")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    public Integer getVersion() {
        return version;
    }

    private void setVersion(Integer version) {
        this.version = version;
    }

    @NotEmpty
    @Length(max = 60)
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

	public String getNumeroPreInscricao() {
		return numeroPreInscricao;
	}

	public void setNumeroPreInscricao(String numeroPreInscricao) {
		this.numeroPreInscricao = numeroPreInscricao;
	}

	public String getNumeroInscricao() {
		return numeroInscricao;
	}

	public void setNumeroInscricao(String numeroInscricao) {
		this.numeroInscricao = numeroInscricao;
	}

	@ManyToOne
	public Cargo getCargo() {
		return cargo;
	}

	public void setCargo(Cargo cargo) {
		this.cargo = cargo;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	
	public String getDddFone() {
		return dddFone;
	}

	public void setDddFone(String dddFone) {
		this.dddFone = dddFone;
	}

	public String getFone() {
		return fone;
	}

	public void setFone(String fone) {
		this.fone = fone;
	}

	public String getDddCelular() {
		return dddCelular;
	}

	public void setDddCelular(String dddCelular) {
		this.dddCelular = dddCelular;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public Integer getQtFilho() {
		return qtFilho;
	}

	public void setQtFilho(Integer qtFilho) {
		this.qtFilho = qtFilho;
	}

	@NotEmpty
	@Email
	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	@Transient
	public String getDataNascimentoFormatada(){
		if(dataNascimento == null){
			return "";
		}
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		return sdf.format(dataNascimento);
	}

	@NotNull
	@Past
	@Temporal(TemporalType.DATE)
	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	@NotNull
	public Long getRg() {
		return rg;
	}

	public void setRg(Long rg) {
		this.rg = rg;
	}

	@NotEmpty
	public String getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(String estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	@NotEmpty
	public String getCanhoto() {
		return canhoto;
	}

	public void setCanhoto(String canhoto) {
		this.canhoto = canhoto;
	}
	
	@Transient
	public String getDataInscricaoFormatada(){
		if (dataInscricao == null){
			return "";
		}
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		return sdf.format(dataInscricao);
	}
	
	

	@NotNull
	public Date getDataInscricao() {
		return dataInscricao;
	}

	public void setDataInscricao(Date dataInscricao) {
		this.dataInscricao = dataInscricao;
	}

	public String getObs() {
		return obs;
	}

	public void setObs(String obs) {
		this.obs = obs;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Candidato other = (Candidato) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@NotNull
	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	@ManyToOne
	public Localidade getLocalidade() {
		return localidade;
	}

	public void setLocalidade(Localidade localidade) {
		this.localidade = localidade;
	}

	public Boolean getCadeirante() {
		return cadeirante;
	}

	public void setCadeirante(Boolean cadeirante) {
		this.cadeirante = cadeirante;
	}

	public Boolean getVisualBraile() {
		return visualBraile;
	}

	public void setVisualBraile(Boolean visualBraile) {
		this.visualBraile = visualBraile;
	}

	public Boolean getVisualLeitor() {
		return visualLeitor;
	}

	public void setVisualLeitor(Boolean visualLeitor) {
		this.visualLeitor = visualLeitor;
	}

	public Boolean getGestante() {
		return gestante;
	}

	public void setGestante(Boolean gestante) {
		this.gestante = gestante;
	}

	public Boolean getLactante() {
		return lactante;
	}

	public void setLactante(Boolean lactante) {
		this.lactante = lactante;
	}

	public Boolean getOutros() {
		return outros;
	}

	public void setOutros(Boolean outros) {
		this.outros = outros;
	}

	@NotNull
	@Length(min=8,max=9)
	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	@OneToOne(cascade = CascadeType.ALL)
	public BoletoPdf getBoletoPdf() {
		return boletoPdf;
	}

	public void setBoletoPdf(BoletoPdf boletoPdf) {
		this.boletoPdf = boletoPdf;
	}
	

	@ManyToOne
	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

	@Column( unique=true , length=10)
	public String getNossoNumero() {
		return nossoNumero;
	}

	public void setNossoNumero(String nossoNumero) {
		this.nossoNumero = nossoNumero;
	}

	@NotNull
	public String getStatusPagamento() {
		return statusPagamento;
	}

	public void setStatusPagamento(String statusPagamento) {
		this.statusPagamento = statusPagamento;
	}

    @Transient
	public String getValorPago() {
    	if(StringUtils.isBlank(valorPago)){
    		return "";
    	}
    	
    	NumberFormat nf = NumberFormat.getInstance();
    	nf.setCurrency(Currency.getInstance("BRL"));
    	nf.setMaximumIntegerDigits(3);
    	nf.setMaximumFractionDigits(2);
    	nf.setMinimumFractionDigits(2);
    	String tratada = valorPago.substring(0, 13) + "." + valorPago.substring(13);
    	String formatado = nf.format(new Double(tratada));
		return formatado;
	}

	public void setValorPago(String valorPago) {
		this.valorPago = valorPago;
	}

	@ManyToOne
	public RetornoBB getRetornoBB() {
		return retornoBB;
	}

	public void setRetornoBB(RetornoBB retornoBB) {
		this.retornoBB = retornoBB;
	}

	@Temporal(TemporalType.DATE)
	public Date getDataVencimentoBoleto() {
		return dataVencimentoBoleto;
	}

	public void setDataVencimentoBoleto(Date dataVencimentoBoleto) {
		this.dataVencimentoBoleto = dataVencimentoBoleto;
	}
	
	@Transient
	public String getNumeroInscricaoFormatado(){
		
		String nif = "";
		if(cargo != null && cargo.getCodigo() != null && numeroInscricao != null){
			nif = cargo.getCodigo();
			nif += StringUtils.leftPad(numeroInscricao.toString(), 4 , '0');
		}
		return nif;
	}

	public Boolean getSolicitouIsencao() {
		return solicitouIsencao;
	}

	public void setSolicitouIsencao(Boolean solicitouIsencao) {
		this.solicitouIsencao = solicitouIsencao;
	}

	public Boolean getFoiDeferidoIsencao() {
		return foiDeferidoIsencao;
	}

	public void setFoiDeferidoIsencao(Boolean foiDeferidoIsencao) {
		this.foiDeferidoIsencao = foiDeferidoIsencao;
	}

	public Boolean getSolicitouDesconto() {
		return solicitouDesconto;
	}

	public void setSolicitouDesconto(Boolean solicitouDesconto) {
		this.solicitouDesconto = solicitouDesconto;
	}

	public Boolean getFoiDeferidoDesconto() {
		return foiDeferidoDesconto;
	}

	public void setFoiDeferidoDesconto(Boolean foiDeferidoDesconto) {
		this.foiDeferidoDesconto = foiDeferidoDesconto;
	}

public static void main(String[] args) {
	NumberFormat nf = NumberFormat.getInstance();
	nf.setCurrency(Currency.getInstance("BRL"));
	nf.setMaximumIntegerDigits(3);
	nf.setMaximumFractionDigits(2);
	nf.setMinimumFractionDigits(2);
	String original = "000000000012000";
	String tratada = original.substring(0, 13) + "." + original.substring(13);
	
	System.out.println(nf.format(new Double(tratada)));
}

public Boolean getMailPgEnviado() {
	return mailPgEnviado;
}

public void setMailPgEnviado(Boolean mailPgEnviado) {
	this.mailPgEnviado = mailPgEnviado;
}	
	

}
